package network;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;

/*服务器其实也没啥，首先就得有一个socket对象，因为通信就需要socket对象在网卡上进行通信
* 构造服务器，构造的时候组要是把端口号传进去，*/
public class UdpEchoServer1 {
    //先定义一个socket对象
    //通过网络通信，必须要使用socket对象（这就是用来通信的一个工具，就像买快递时，这个就是快递员，packet就是包裹，就是通信要传输的对象）
    /*packet是一个基本单位，就是在socket文件传输中的一个基本单位*/
    private DatagramSocket socket = null;

    //绑定一个端口，但是不一定就可以绑定成功，如果这个端口被占用了则不能关联成功
    //同一个主机上同一时刻同一个端口只能运行一个进程
    public UdpEchoServer1(int port) throws SocketException {
        socket = new DatagramSocket(port);
    }

    //启动服务器后的主逻辑
    public void start() throws IOException {
        System.out.println("服务器启动！");
        while (true) {
            //每次进行循环要做3件事：
            //1.读取请求，并进行解析
            DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);//这相当于是一个输出时参数
            socket.receive(requestPacket);
            //为了方便处理这个请求，先把数据包转换成String字符串
            String request = new String(requestPacket.getData(),0,requestPacket.getLength());//这里的参数就是获取从0下标到有效数据长度的数据
            //2.根据请求，计算响应
            String response = process(request);
            //3.把响应反馈给客户端   响应之前要先把字符串转化成数据包然后再进行发送
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,
                    requestPacket.getSocketAddress());
            //发送给客户端
            socket.send(responsePacket);
            //打印日志
            System.out.printf("[%s:%d] req:%s, resp:%s\n",responsePacket.getAddress().toString(),responsePacket.getPort(),
                    request,response);
        }
    }

    private String process(String request) {
        return request;
    }

    public static void main(String[] args) throws IOException {
        UdpEchoServer1 udpEchoServer1 = new UdpEchoServer1(999);
        udpEchoServer1.start();
    }
}
